import { useUserStore } from '@/stores'
import router from '@/router'
import axios from 'axios'
import { showFailToast } from 'vant'
// 说明：不能放到这里调用，因为pinia还没有初始化
// const store = useUserStore()

// 1. 新axios实例，基础配置
/**
 * api请求地址：
 * 1. 开发期间（开发环境=> pnpm dev）：可能是一个ip地址或者locahost:7001(临时)
 * 2. 生产期间（生产环境=> pnpm build）：就是一个域名
 */
// const baseURL = 'https://consult-api.itheima.net/'
const baseURL = import.meta.env.VITE_APP_BASEURL

const request = axios.create({
  baseURL,
  timeout: 10000
})

// 2. 请求拦截器，携带token=> 发请求前执行
request.interceptors.request.use(
  (config) => {
    // 业务场景：在header统一添加token
    const store = useUserStore()
    if (store.user?.token) {
      config.headers.Authorization = `Bearer ${store.user.token}`
    }
    return config
  },
  (err) => Promise.reject(err)
)

// 3. 响应拦截器，剥离无效数据，401拦截 =》请求发出去，后台已经响应
request.interceptors.response.use(
  (res) => {
    // 1. 请求成功=》http状态码（基于http协议标准） 200～300之间
    // 后台约定(自定义状态码)，响应成功（http状态码是200），但是code不是10000，是业务逻辑失败
    // == 实际开发要和后台确定：后台小伙伴是否有自定义状态码 ==
    if (res.data?.code !== 10000) {
      showFailToast(res.data.message)
      return Promise.reject(res.data)
    }
    // 成功提示
    // showSuccessToast(res.data.message)
    // 业务逻辑成功，返回响应数据，作为axios成功的结果
    return res.data?.data
  },
  (err) => {
    // 2. 请求失败 =》http状态码 200～300之外
    if (err.response.status === 401) {
      // 删除用户信息
      const store = useUserStore()
      store.delUser()
      // 跳转登录，带上接口失效所在页面的地址，登录完成后回跳使用
      // 说明：returnUrl回跳地址,下次登录成功回到上次访问的页面
      // v3下：router.currentRoute是ref变量，需要使用.value访问变量值
      // router.currentRoute.value.fullPath => 全路径 /home?id=1
      // router.currentRoute.value.path =》路径 /home
      router.push(`/login?returnUrl=${router.currentRoute.value.fullPath}`)
    }
    return Promise.reject(err)
  }
)

export { baseURL, request }
